home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 3 / Amiga Format CD03 (1996-07-04)(Future Publishing)(GB)(Track 1 of 6)[!][issue 1996-08].iso / comms / netsoftware / ftpdaemon.lha / ftpd2 / ftpd.c < prev    next >
C/C++ Source or Header  |  1993-10-30  |  4KB  |  234 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4. #include <string.h>
  5. #include <errno.h>
  6. #include <netdb.h>
  7. #include <setjmp.h>
  8. #include <sys/types.h>
  9. #include <netinet/in.h>
  10. #include <arpa/ftp.h>
  11. #include "ftpd.h"
  12. #include "cmdimp.h"
  13.  
  14. #include <proto/exec.h>
  15. #include <proto/dos.h>
  16. #include <proto/multiuser.h>
  17. #include <libraries/multiuser.h>
  18.  
  19. #define MAXHOSTNAMELEN 60
  20. int gethostname(char *,int);
  21.  
  22. char Buf[1024];            // sprintf buffer
  23. struct muBase *muBase;
  24. struct muUserInfo *UserInfo;    // Info over huidig ingeloggde user
  25.  
  26. void yyparse(void);
  27.  
  28. extern char cbuf[];
  29.  
  30. int    data;
  31. jmp_buf    errcatch, urgcatch;
  32. int    logged_in;
  33. int askpasswd;
  34. char *pw;
  35. int    timeout = 900;    /* timeout after 15 minutes of inactivity */
  36. int    maxtimeout = 7200;/* don't allow idle time to be set beyond 2 hours */
  37. int    guest;
  38. int    type;
  39. int    form;
  40. int    stru;            /* avoid C keyword */
  41. int    mode;
  42. int    usedefault=1;        /* for data transfers */
  43. int    pdata = -1;        /* for passive mode */
  44. int    transflag;
  45. long file_size;
  46. long byte_count;
  47.  
  48. struct    sockaddr_in ctrl_addr;
  49. struct    sockaddr_in data_source;
  50. struct    sockaddr_in data_dest;
  51. struct    sockaddr_in his_addr;
  52. struct    sockaddr_in pasv_addr;
  53.  
  54. #if !defined(CMASK) || CMASK == 0
  55. #undef CMASK
  56. #define CMASK 027
  57. #endif
  58.  
  59. int    defumask = CMASK;        /* default umask value */
  60. char    tmpline[7];
  61. char    hostname[MAXHOSTNAMELEN];
  62. char    remotehost[MAXHOSTNAMELEN];
  63.  
  64. void socketflush(long socket)
  65. {
  66. }
  67.  
  68. int socketvprintf(long socket,char *fmt,va_list args)
  69. {
  70.     int x;
  71.     
  72.     x=vsprintf(Buf,fmt,args);
  73.     send(socket,Buf,strlen(Buf),0);
  74.     
  75.     return x;
  76. }
  77.     
  78. int socketprintf(long socket,char *fmt,...)
  79. {
  80.     va_list ap;
  81.     int x;
  82.     
  83.     va_start(ap,fmt);
  84.     x=socketvprintf(socket,fmt,ap);
  85.     va_end(ap);
  86.     
  87.     return x;
  88. }
  89.  
  90. int socketstdprintf(char *fmt,...)
  91. {
  92.     va_list ap;
  93.     int x;
  94.     
  95.     va_start(ap,fmt);
  96.     x=vprintf(fmt,ap);
  97.     va_end(ap);
  98.     
  99.     return x;
  100. }
  101.     
  102. int socketputs(long socket,char *s)
  103. {
  104.     send(socket,s,strlen(s),0);
  105.  
  106.     return 0;
  107. }
  108.  
  109. int socketputchar(long socket,char c)
  110. {
  111.     send(socket,&c,1,0);
  112.     
  113.     return 0;
  114. }
  115.  
  116.  
  117. int socketgetchar(long socket)
  118. {
  119.     char c;
  120.     
  121.     if(recv(socket,(char *)&c,1,0)==-1) return EOF;
  122.     
  123.     return (int)c;
  124. }
  125.  
  126. void fatal(char *s)
  127. {
  128.     reply(451, "Error in server: %s\n", s);
  129.     reply(221, "Closing connection due to server error.");
  130. }
  131.  
  132. void reply(int n,char *fmt,...)
  133. {
  134.     va_list ap;
  135.     
  136.     printf("%d ", n);
  137.     va_start(ap,fmt);
  138.     vprintf(fmt,ap);
  139.     va_end(ap);
  140.     puts("\r\n");
  141. }
  142.  
  143. void lreply(int n,char *fmt,...)
  144. {
  145.     va_list ap;
  146.     
  147.     printf("%d- ",n);
  148.     va_start(ap,fmt);
  149.     vprintf(fmt,ap);
  150.     va_end(ap);
  151.     puts("\r\n");
  152. }
  153.  
  154. void ack(char *s)
  155. {
  156.     reply(250, "%s command successful.", s);
  157. }
  158.  
  159. void nack(char *s)
  160. {
  161.     reply(502, "%s command not implemented.", s);
  162. }
  163.  
  164. void perror_reply(int code,char *string)
  165. {
  166.     if (errno < sys_nerr)
  167.         reply(code, "%s: %s.", string, sys_errlist[errno]);
  168.     else
  169.         reply(code, "%s: unknown error %d.", string, errno);
  170. }    
  171.  
  172. void yyerror(char *s)
  173. {
  174.     char *cp;
  175.  
  176.     if (cp = index(cbuf,'\n'))
  177.         *cp = '\0';
  178.     reply(500, "'%s': command not understood.", cbuf);
  179. }
  180.  
  181. void end_login(void)
  182. {
  183.     pw = NULL;
  184.     logged_in = 0;
  185.     guest = 0;
  186. }
  187.  
  188. void CloseMultiUser(void) {
  189.     if(UserInfo) muFreeUserInfo(UserInfo);
  190.     if(muBase) CloseLibrary((struct Library *)muBase);
  191. }
  192.  
  193. void main(void)
  194. {
  195.     char *hn;
  196.     long addrlen;
  197.     
  198.     if(server_socket==-1) exit(20);
  199.     
  200.     // Openen multiuser library
  201.     atexit(CloseMultiUser);
  202.     muBase=(struct muBase *)OpenLibrary(MULTIUSERNAME,MULTIUSERVERSION);
  203.     if(muBase && !(UserInfo=muAllocUserInfo())) exit(1);
  204.     
  205.     addrlen = sizeof (his_addr);
  206.     if (getpeername(0,(struct sockaddr *)&his_addr, &addrlen) < 0)
  207.     {
  208.         exit(1);
  209.     }
  210.     addrlen = sizeof (ctrl_addr);
  211.     if (getsockname(0,(struct sockaddr *)&ctrl_addr, &addrlen) < 0)
  212.     {
  213.         exit(1);
  214.     }
  215.     data_source.sin_port=htons(ntohs(ctrl_addr.sin_port)-1);
  216.     
  217.     data = pdata = -1;
  218.     type = TYPE_A;
  219.     form = FORM_N;
  220.     stru = STRU_F;
  221.     mode = MODE_S;
  222.     tmpline[0] = '\0';
  223.     
  224.     hn=getenv("HOSTNAME");
  225.     if(hn) strncpy(hostname,hn,sizeof(hostname));
  226.     else strcpy(hostname,"unknown");
  227.     free(hn);
  228.     
  229.     reply(220, "%s FTP server (AMIGA 1.0) ready.", hostname);
  230.     (void) setjmp(errcatch);
  231.     for (;;)
  232.         yyparse();    
  233. }
  234.